package com.softeem.sanguo;

/**
 * 玩家发射的篮球
 */
public class Ball extends Sprite implements Runnable{

    //声明球飞行方向
    private char dir;

    /**
     * 构造器：在创建对象时执行初始化操作
     *
     * @param panel
     */
    public Ball(GamePanel panel,int x,int y,char dir) {
        super(panel);
        //设置篮球初始坐标
        setX(x);
        setY(y);
        //设置球的飞行方向
        this.dir=dir;
    }

    public char getDir() {
        return dir;
    }

    @Override
    public void init() {
        //设置篮球的图片
        setImg(Images.ball);
        //设置篮球大小
        setW(getImg().getWidth());
        setH(getImg().getHeight());
    }

    /**
     * 该变球的飞行轨迹
     */
    public void changeLocation(){
        //根据移动方向修改篮球的坐标（x坐标）
        if(dir == 'R'){
            //右
            setX(getX() + Config.BALL_SPEED);
        }else{
            //左
            setX(getX() - Config.BALL_SPEED);
        }

        //判断球是否飞出屏幕之外
        if(getX() < -getW() || getX() > Config.SC_WIDTH){
            //标记球销毁
            setDeath(true);
        }
    }


    @Override
    public void run() {
        while(!isDeath()){
            changeLocation();
            //判断球和敌人是否产生碰撞(循环遍历)
            getPanel().enemies.forEach(e->{
                //判断当前篮球是否与每一个敌人碰撞
                if(Utils.isHit(getX(),getY(),getW(),getH(),e.getX(),e.getY(),e.getW(),e.getH())){
                    //标记篮球销毁
                    setDeath(true);
                    //随机减少一定血量
                    int dec = Utils.randomNum(10,20);
                    e.hp -= dec;
                    if(e.hp <= 0){
                        //敌人死亡
                        e.setDeath(true);
                        //标记敌人为被玩家杀死
                        e.kill = true;
                    }
                }
            });
            try {
                //每隔0.05秒执行一次
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        //清理篮球
        destroy();
    }

    @Override
    public void destroy() {
        //清理篮球:从集合中移除已经销毁的篮球对象
        getPanel().hero.balls.remove(this);
    }

}
